# 这是一个示例 Python 脚本。
# Author:xiefan
# 时间：1013-week07

##      课堂笔记1.0-列表基本方法
letters = ['a','b','c','d']
print(len(letters))
print("-------------------------")


names = ["Mike","Mary","Jan","Jack"]
# 列表的使用方法
## 1.  增加 append() 增加在list的末尾
# names.append(1)
"""
print(names)
names = ["Mike","Mary","Jan","Jack"]
names.append("Alex")
print(names)
names.append("zhichao")
print(names)
"""
## 2.  插入insert() 可以指定位置增加元素
#
"""
names.insert(0,"youge")
print(names)
names.insert(2,"youge")
print(names)  # 列表可以放重复的值
"""

## 3.  删除 remove() 和pop()
## 优势： 如果删除list中多个元素，remove比较合适
##  3.1 一般情况下 使用remove()先用 in 做判断; 例子：学号为1的同学可方便删除
"""
if 1 in names:
    names.remove(1)
"""

##  3.2 pop() 删除位置为1的这个元素
"""
names.pop(1)
print("pop()方法后的names:",names)
"""

## 4. index()索引 查看该元素如1001 在stu_id中第一个出现的位置索引
"""
stu_id = [10001,10002,10003,10004,10008,10001,10009,10010,10001]
# 思考，如何取出所有位置10001的index？
for i in stu_id:
    # 循环遍历stu_id的所有内容
    if i == 10001:
        print()
## 一般方法？
"""

## 5. clear()消除所有数据
"""
names.clart()
print("清楚names列表后的值",names)
"""

## 6. count()查看列表元素出现的个数,(简单应用）统计分数出现的次数
"""
print("count方法的结果：",stu_id.count(10001))
print(names)
"""

## 7. extend() 是给指定的list进行扩充
"""
names.extengd(sut_id)
print(names)
"""


##      课堂笔记2.0-列表的高级方法之copy()

stu_id = [10001,10002,10003,10004,10008,10001,10009,10010,10001]

# 1. copy()很重要
# 思考，赋值是真正的复制么？ 赋值(=) <=> copy? 不等价
stu_id_matedata = stu_id
print("stu_id:",stu_id,'\n','stu_id_matedata:',stu_id_matedata)

# 实验 1 赋值
# stu_id.pop(1)
# print("stu_id:",stu_id,'\n','stu_id_matedata:',stu_id_matedata)

# 实验2 copy()
# stu_id_matedata = stu_id.copy()
# stu_id.pop(1)
# print("stu_id:",stu_id,'\n','stu_id_matedata:',stu_id_matedata)

# 实验3 切片实现复制
stu_id_matedata = stu_id[:]
stu_id.pop(1)
print("stu_id:",stu_id,'\n','stu_id_matedata:',stu_id_matedata)
print("-------------------------")

##      课堂笔记3.0-列表的高级方法之枚举
#   index和枚举：index只能查找列表中相同元素的第一个元素，而枚举可以找出所有重复的元素以及他们所在的位置
##  index()索引 查看该元素如1001 在stu_id中第一个出现的位置索引
stu_id = [10001,10002,10003,10004,10008,10001,10009,10010,10001]
# 思考，如何取出所有位置10001的index？
for i in stu_id:
    # 循环遍历stu_id的所有内容
    if i == 10001:
        print()
        # 判断如果元素为10001的时候，怎么取出索引呢？
# enumerate()
pop_values_list = [] # append方法经常用于新建列表
for index,item in enumerate(stu_id):
    #print(index,item)
    if item == 10001:
        print(index,item)
        pop_values_list.append(index)
print("我们想要删除pop()的值:",pop_values_list)

##作业
print("---------------下面是作业环节!!!----------------------")
##      list方法总结   及    list切片总结  +  课本自习内容

###          list方法总结
print("--------增加append--------")
# append()方法在列表的末尾增加一个对象
found = []
print(len(found))
found.append("p")
found.append("y")
found.append("t")
found.append("h")
found.append("o")
found.append("n")

print("--------删除remove、pop--------")
# remove() 方法从列表中删除对象
nums = [1, 2, 3, 4]
print(nums)
nums.remove(3)
print(nums)

# pop() 方法根据对象的索引值从现有列表删除和返回一个对象
nums.pop() # 没有指定索引值则默认删除和返回列表中最后一个对象
print(nums)
nums.pop(0)
print(nums)

print("--------扩展extend-----------")
# extend() 方法接受第二个列表，将其中的各个对象增加到现有列表；合二为一。
nums.extend([3, 4])
print(nums)
nums.extend([])

print("--------插入insert-----------")
# 在列表中插入一个对象
# insert() 方法将一个对象插入到现有列表中指定索引值前面
nums.insert(0,1) # (索引值, 对象)
print(nums)
# 使用insert()方法将一个对象插入现有列表任意槽
nums.insert(2,"two-and-a-half") # 第一个参数指示要插入到哪个索引值之前
print(nums)

print("-------查看len、count-------------")
## len() 方法查看列表元素的个数
## count() 方法查看该元素在列表出现的次数
names=['iron man','Thor','Hulk','Vision']
print('列表元素个数：',len(names))
print('列表中元素出现的个数：',names.count('iron man'))

##          list切片总结(通过下列课本项目分析）
# 对比panic.py 和 panic2.py
# panic.py 使用列表的方法来处理 而 panic2.py 用的是切片的方法
# 列表的方法会改变一个列表的原始状态，而切片通常不会改变列表的状态

##          list课本自习
# vowels.py
# for循环加列表并开始工作
vowels = ['a','e','i','o','u']#定义元音列表
word = "Milliways"
for letter in word:#对象是否在另一个对象中，可用" in "来检查
    if letter in vowels:
        print(letter)
print("-----------------------------------------------")

# 空列表；利用len解释器确认其中没有对象
found = []
print(len(found))
print("------------------------------------------------")

# append()方法在列表的末尾增加一个对象
found.append("p")#反复调用appen（）方法在列表末尾增加更多对象
found.append("y")
found.append("t")
found.append("h")
found.append("o")
found.append("n")
print(found,len(found))#列表长度会增加

# 除了使用 in 操作符检查对象是否包含在一个集合中
# 还可以使用 not in 操作符组合来检查一个集合中是否不存在某个对象
if'u' not in found:
    found.append('u')
print(found,len(found))
print("-----------------------------------------------")

# vowels2.py（修改代码）
vowels = ['a','e','i','o','u']
word = "Milliways"
found = []#空列表起手
for letter in word:
    if letter in vowels:#
        if letter not in found:#增加这个代码来确定是否更新found元音列表
            found.append(letter)
for vowel in found:# 第一个for循环结束时，第二个循环开始运行，它会显示”word“中找到的元音
    print(vowel)
print("---------------------------------------------------")

# vowels3.py(增加input用户输入）

vowels = ['a','e','i','o','u']
word = input("Provide a word to search for vowels:")
found = []#
for letter in word:
    if letter in vowels:
        if letter not in found:#增加这个代码来确定是否更新found元音列表
            found.append(letter)
for vowel in found:# 第一个for循环结束时，第二个循环开始运行，它会显示”word“中找到的元音
    print(vowel)
print("---------------------------------------------------")

# 列表删除对象
# remove() 方法从列表中删除对象
# remove:取一个对象值作为唯一参数
nums = [1, 2, 3, 4]
print(nums)
nums.remove(3)
print(nums) # [1, 2, 4]

# 列表弹出对象
# pop() 方法根据对象的索引值从现有列表删除和返回一个对象
# pop：取一个可选的索引值作为参数
nums.pop() # 没有指定索引值则默认删除和返回列表中最后一个对象
print(nums) # [1,2]
nums.pop(0) #0对应列表中第一个对象
print(nums) # [2]

# 用对象扩展列表
# extend() 方法接受第二个列表，将其中的各个对象增加到现有列表；合二为一。
# extend：取一个对象列表作为唯一参数
nums.extend([3, 4])
print(nums) # 将[3，4]添加到nums列表中; [2, 3, 4]
nums.extend([])# 不会发生改变

# 在列表中插入一个对象
# insert() 方法将一个对象插入到现有列表中指定索引值前面
# insert：取一个索引值和一个对象作为参数
nums.insert(0,1) # (索引值, 对象)
print(nums) # [1, 2, 3, 4]
# 使用insert()方法将一个对象插入现有列表任意槽
nums.insert(2,"two-and-a-half") # 第一个参数指示要插入到哪个索引值之前
print(nums)
print("----------------------------------------------------")

# panic.py
# Don't panic! --> on tap
phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
for i in range(4): # for循环删除最后一个对象四次  “nic！”
    plist.pop() # 删除最后一个对象
plist.pop(0) # 删除第一个对象“D”
plist.remove("'") # 删除 特殊符号
plist.extend([plist.pop(),plist.pop()]) # 交换列表末尾两个对象 "ont ap"
plist.insert(2,plist.pop(3)) # 空格字符移动到 t 前 “on tap”
new_plist = "".join(plist)  # 将列表转换成字符串
print(plist)
print(new_plist)
print("--------------------------------------------------------------")

# 将一个列表复制到另一个列表
# copy() 方法
first = [1, 2, 3, 4, 5,]
second = first
print(second)
second.append(6)
print(first, second) # 这个会导致first列表和second列表同时变化

# copy() 方法可避免上述问题
third = second.copy()
print(third)
third.append(7)
print(second,third) # third列表多了 7
print("-------------------------------------------------------")

# 以下为知识盲区 995
# panic2.py
# Don't panic! --> on tap
phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
new_phrase = ("".join(plist[1:3])) + \
    ("".join([plist[5], plist[4], plist[7], plist[6]]))
print(new_phrase)

# 对比panic.py 和 panic2.py
# panic.py 使用列表的方法来处理 而 panic2.py 用的是切片的方法
# 列表的方法会改变一个列表的原始状态，而切片通常不会改变列表的状态
print("------------------------------------------------------------")

# for 循环了解列表
# marvin.py
paranoid_android = "Marvin"
letters = list(paranoid_android)
for i in letters:
    print('\t', i)  # \t 一个tab键，四个空格
print("------------------------------------------------------------")


# for 循环了解切片
# mavin2.py
paranoid_android = "Marvin, the Paranoid Android"
letters = list(paranoid_android)
for i in letters[:6]:
    print('\t', i)
print()
for j in letters[-7:]:
    print('\t'*2, j)
print()
for k in letters[12:20]:
    print('\t'*3, k)
print()


